[Docker] 基本語法紀錄


Posted by mike-hsieh on 2024-05-03

介紹 docker

-- docker api 說明
docker --help
docker

-- 版本
docker --version
docker -v

Docker 三寶:

  1. Image(映像檔): 蛋糕模型。
  2. Container(容器): 蛋糕實體。
    2.1 隔離性:一個Image每一次都會產生一個唯一的Container,可一起執行,互不干擾。
    2.2 輕量級:只需包含應用程式、依賴項和套件...等等,啟動和停止速度極快。
    2.3 可移植性:封裝好應用程式、環境變數、套件...等所有需要的元素,只運行這些內容,跟本地環境無關。
    2.4 快速部署:基於輕量級和可移植性。
    2.5 容器生態系統:Docker 提供了一系列工具和服務,可以輕鬆地管理、監控和編排容器們。例如,Docker Compose 可以用於定義和執行多個容器。
    2.6 版本控制:因隔離性,每個Container的ID都不同,所以可以切換版本。
    2.7 容器共享:基於可移植性。
    2.8 持續整合與持續交付(CI/CD):Docker Container(容器)可自動化建置、測試和部署流程,讓部屬變得簡單且自動化,我們可以設定自動將 GitHub 上專案的 main 分支,若有新的進度就自動部署,如此一來可以節省許多部署的時間。

  3. Repository(儲存庫): 蛋糕模型倉庫,儲存Image。

Docker 使用流程:
Dockerfile ---> Image ---> Container

-- 依照image產生container,並運行
docker container run hello-world
docker run hello-world

-- 停止container
docker container stop hello-world
docker stop hello-world

-- 全部容器的 process status
docker ps --all
docker ps

-- 尋找當前目錄中的 .Dockerfile 檔案,並建立為image,名稱為隨機生成的ID
docker build .

-- 尋找當前目錄中的 .Dockerfile 檔案,並建立為image,名稱myapp
docker build --tag myapp .
docker build -t myapp .

-- 列出本地的所有 images
docker images

-- 從遠端 registry (倉庫)下載 image (映像)到本地
docker pull

-- 將本地的 image (映像)上傳到遠端 registry (倉庫)。
docker push

Container

-- 啟動 Ruby Container,但沒有交互式、終端
docker run ruby
docker run ruby:3.2.2

-- Ruby Container已經關閉了
docker ps -a

-- 交互模式:可以進到容器內部互動
docker run -i -t ruby /bin/bash

-- irb 是 Ruby 附帶的交互編程環境 by 石冢敬树
irb

-i:代表 "交互式"(Interactive)。這個指令可以讓你輸入指令。如果沒有使用 -i ,則容器不會接受輸入的指令(就是你怎麼輸入他都不理你)。
-t:代表 "終端"(Terminal)。這個指令是讓 Docker 為容器分配一個虛擬終端幾,讓我們可以在容器內部進行命令操作。如果沒有使用 -t ,你就想像成沒有一個可以打指令的地方(沒有終端機)。
/bin/bash:代表命令解析器(Shell)。用於解釋和執行命令、腳本以及與系統交互的操作。

-- 容器裡停止

  1. 輸入exit -> 按下enter
  2. ctrl + d

-- 背景(持久)模式執行:那在 docker 時,使用 -d 即可在背景執行,不會多佔一個終端機的概念
docker run -d ruby

-- 命名我的 container
docker run --name my_ruby ruby

-- 指令都可以根據狀況組合使用
docker run -it --name ruby_test ruby

-- 開始 Container
docker start

-- 其他終端機停止
docker stop

--刪除 Container (不能刪除運行中的container)
docker rm

Network

Bridge Network (橋接網絡): 每個 Container (容器)都會分配一个獨立、不重複的 IP 地址,而這些 IP 地址是私有的,只能在 Container (容器)內找到,無法跟 Container (容器)外部聯絡。
Host Network(主機網路): 翻譯官本人出國時,因為本來就會當國語言,他就不需要再另外請翻譯,因為他自己就聽得懂。
隱憂: 隔離性和安全性。
None Network(無網路): 無人島,完全隔離並且沒有任何網絡訪問權限。

-- 查看本機 docker 網路列表
docker network ls

-- 查看一個container的所有詳細資訊
docker inspect

-- 建立網路
docker network create

-- 置換 container 的 natwork 為特定 natwork
docker network connect

-- 斷開 Network(網路)與 Container (容器) 的連接
docker network disconnect

-- 移除網路
docker network rm

Image Tag

Tags(標籤)可以包括字母、數字、橫線(-)和下劃線(_),但不建議使用特殊符號(.、:、/等)。

-- 建立自己的 Tags(標籤): 類似定義自己的版本號,
docker tag <本機現有映像 id_or_repository>:<本機現有標籤> <新映像 repository>:<新標籤>
docker tag ruby:latest ruby:v1

-- 依照指定的Image,複製一個新的自定義名稱的Image
docker tag <本機現有映像id_or_repository> <新映像 repository>
docker tag ruby my-ruby

-- 建立+推送(push)自己的 Tags(標籤)
docker tag <本機現有映像id_or_repository> <Docker 儲存庫的主機名或 IP 地址>:<端口>/<新映像 repository>:<新標籤>

1. 就是我們上面介紹的建立新的 Tags(標籤)
2. 還包含了將這個新 Tags(標籤)的 Image(映像),推送到指定的 Docker 儲存庫 (myregistryhost:5000) 中,以便在遠端的主機上使用或與其他人共享。

Docker Image(映像) 的常用語法

-- 拉取 Image(映像)
docker pull 映像名稱:版本

-- 刪除 Image(映像)
docker rmi <映像ID或名稱>
remove image => rmi

-- 建立 Image(映像) 非當前路徑
docker build -t 映像名稱:版本
-t 是 tag 的意思
Dockerfile 正常都會位於當前目錄,所以若是當前目錄我們可以寫成

-- 建立 Image(映像) 當前路徑
docker build -t 映像名稱:版本 .
.就代表當前目錄 ; 需要特別寫路徑,則是因為 Dockerfile 不在當前目錄

-- 將 Image(映像) 推送到註冊表
docker push 映像名稱:版本
這邊的話不特別寫要推到哪個註冊表,就是預設推到 Docker Hub 註冊表

-- 將 Image(映像) 推送到非Docker Hub註冊表
docker push <目標註冊表URL>/圖片名稱:版本
如果有其他註冊表如: Google Container Registry(GCR)或 Amazon Elastic Container Registry(ECR)

-- 查看 Image(映像) 的詳細資料
docker inspect <映像名稱或ID>


#docker #Command







Related Posts

1731. The Number of Employees Which Report to Each Employee

1731. The Number of Employees Which Report to Each Employee

2019 Web Backend 面試總結

2019 Web Backend 面試總結

 Python Table Manners 系列

Python Table Manners 系列


Comments